package com.deuwise.system.controller;

import com.deuwise.common.utils.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *@author hezhenhao
 *@date 2020-03-25 14:39:36
 */
@Api(tags = "地图图层服务解析模块", description = "地图图层服务解析")
@RequestMapping("api/mapProjectinfo")
@RestController()
public class ServiceAnalysisController {

    @ApiOperation(value = "服务解析获取图层字段")
    @GetMapping("/syncLayerProperty")
    public R layerFieldsAnalysis(String serviceUrl){
        if (StringUtils.isBlank(serviceUrl)) {
            System.out.println("服务URL不能为空！");
            return R.error(200,"Service URL地址不正确！");
        }
        return getFieldList(serviceUrl);
    }

    /**
     * 获取字段列表
     * @param serviceUrl
     */
    public R getFieldList(String serviceUrl){
        List<Map<String, String>> list = new ArrayList<Map<String, String>>();
        /*创建输入流用于读取流*/
        InputStream is=null;
        /*包装流,加快读取速度*/
        BufferedReader br=null;
        /*用来保存读取页面的数据.*/
        StringBuffer html=new StringBuffer();
        /*创建临时字符串用于保存每一次读的一行数据，然后html调用append方法写入temp;*/
        String  temp="";
        try {
            /*获取URL;*/
            URL url2 = new URL(serviceUrl);
            /*打开流，准备开始读取数据;*/
            is = url2.openStream();
            /*将流包装成字符流，调用br.readLine()可以提高读取效率，每次读取一行;*/
            br= new BufferedReader(new InputStreamReader(is, "UTF-8"));
            /*读取数据,调用br.readLine()方法每次读取一行数据,并赋值给temp,如果没数据则值==null,跳出循环;*/
            while ((temp = br.readLine()) != null) {
                /*将temp的值追加给html,这里注意的时String跟StringBuffere的区别前者不是可变的后者是可变的;*/
                html.append(temp);
            }
            /*接下来是关闭流,防止资源的浪费;*/
            if(is!=null)
            {
                is.close();
                is = null;
            }
            /*通过Jsoup解析页面,生成一个document对象;*/
            Document doc = Jsoup.parse(html.toString());
            /*图层名称解析*/
            String layerTag = "";
            Elements elementH2 = doc.getElementsByTag("h2");
            if(null != elementH2){
                Map<String, String> resMap = new HashMap<>(16);
                /*得到数据，格式：<h2>Layer: 洋溪让口 (ID: 0)</h2>*/
                layerTag = elementH2.get(0).toString().trim();
                if(StringUtils.isNotBlank(layerTag)){
                    /*截取图层名称*/
                    layerTag = getStr("Layer:(.*?)\\(", layerTag);
                }
            }
            /*通过tag标签得到Fields部分的内容*/
            Elements elements = doc.getElementsByTag("ul");
            /*最后一个ul为 fields的内容*/
            if(null != elements){
                for(Element element : elements){
                    /*字段信息集*/
                    Elements elementsli = element.getElementsByTag("li");
                    if(0 < elementsli.size()){
                        Iterator<Element> iterator = elementsli.iterator();
                        while(iterator.hasNext()){
                            String str = iterator.next().text();
                            if(StringUtils.isNotBlank(str)){
                                /*解析拆分：OBJECTID(type: esriFieldTypeOID, alias: 要素ID)*/
                                Map<String, String> resMap = getFieldObj(str);
                                resMap.put("layerName", layerTag);
                                resMap.put("visiable", "false");
                                list.add(resMap);
                            }
                        }
                    }
                }
            }
        }catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return R.error(200,"服务地址不正确！");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return R.error(200,"服务地址不正确！");
        }
        return R.ok(list);
    }

    /**
     * 获取服务图层类型
     * @param serviceUrl
     */
    public R getGeometryType(String serviceUrl){
        Map<String, String> resMap = new HashMap<>(16);
        /*创建输入流用于读取流*/
        InputStream is=null;
        /*包装流,加快读取速度*/
        BufferedReader br=null;
        /*用来保存读取页面的数据.*/
        StringBuffer html=new StringBuffer();
        /*创建临时字符串用于保存每一次读的一行数据，然后html调用append方法写入temp;*/
        String  temp="";
        try {
            /*获取URL;*/
            URL url2 = new URL(serviceUrl);
            /*打开流，准备开始读取数据;*/
            is = url2.openStream();
            /*将流包装成字符流，调用br.readLine()可以提高读取效率，每次读取一行;*/
            br= new BufferedReader(new InputStreamReader(is));
            /*读取数据,调用br.readLine()方法每次读取一行数据,并赋值给temp,如果没数据则值==null,跳出循环;*/
            while ((temp = br.readLine()) != null) {
                /*将temp的值追加给html,这里注意的时String跟StringBuffere的区别前者不是可变的后者是可变的;*/
                html.append(temp);
            }
            /*接下来是关闭流,防止资源的浪费;*/
            if(is!=null)
            {
                is.close();
                is=null;
            }
            /*通过Jsoup解析页面,生成一个document对象;*/
            Document doc = Jsoup.parse(html.toString());
            /*图层名称解析*/
            String layerTag = "";
            Elements elementH2 = doc.getElementsByTag("h2");
            if(null != elementH2){
                /*得到数据，格式：<h2>Layer: 洋溪让口 (ID: 0)</h2>*/
                layerTag = elementH2.get(0).toString().trim();
                if(StringUtils.isNotBlank(layerTag)){
                    /*截取图层名称*/
                    layerTag = getStr("Layer:(.*?)\\(", layerTag);
                }
            }
            /*图层矢量类型获取*/
            String geometryType = "";
            Elements elementC1 = doc.getElementsByClass("rbody");
            if(null != elementH2){
                String rbody = elementC1.get(0).toString().trim();
                /*图层类型查找*/
                geometryType = getStr("<b>Geometry Type:</b>(.*?)\n", rbody);
            }
            resMap.put("layerName", layerTag);
            resMap.put("geometryType", geometryType);
        }catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return R.error(200,"服务地址不正确！");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return R.error(200,"服务地址不正确！");
        }
        return R.ok(resMap);
    }

    /**
     * 解析字段对象信息
     * @param strText
     * @return
     */
    public Map<String, String> getFieldObj(String strText) {
        Map<String, String> resMap = new HashMap<>(16);
        String [] rgexs = {"(.*?)\\(", "type:(.*?),", "alias:(.*?),", "length:(.*?)\\)"};
        for(int i = 0; i < rgexs.length; i++){
            String rgex = rgexs[i];
            String str = getStr(rgex, strText);
            if(i == 2 && StringUtils.isEmpty(str)){
                str = getStr("alias:(.*?)\\)", strText).trim();
            }
            switch (i){
                case 0:
                    resMap.put("field", str);
                    break;
                case 1:
                    resMap.put("layerType", str);
                    break;
                case 2:
                    resMap.put("alias", str);
                    break;
                case 3:
                    resMap.put("length", str);
                    break;
            }
        }
        return resMap;
    }

    /**
     * 字符查找并且返回
     * @param rgex
     * @param strText
     * @return
     */
    public String getStr(String rgex, String strText){
        Pattern pattern = Pattern.compile(rgex);
        Matcher m = pattern.matcher(strText);
        String str = "";
        while(m.find()) {
            str = m.group(1);
        }
        return str;
    }
}
